package com.glls.stream;

import com.glls.lambda.pojo.Student;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @date 2022/10/4
 * @desc  Stream 流的概念    和    创建操作
 *
 * Java8中有两大最为重要的改变。第一个是 Lambda 表达式；
 * 另外一 个则是 Stream API(java.util.stream.*)。
 * Stream 是 Java8 中处理集合的关键抽象概念，它可以指定你希望对 集合进行的操作，
 * 可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作，
 * 就类似于使用 SQL 执行的数 据库查询。也可以使用 Stream API 来并行执行操作。
 * 简而言之， Stream API 提供了一种高效且易于使用的处理数据的方式。
 *
 * Stream 流 和 咱们前面学的IO流不太一样  IO流强调数据（字节,字符）的传输   Stream 流强调数据(集合，数组等概念)的处理
 *
 * 对于Stream 流来说  集合 和数组等批量数据 就是Stream 流处理的数据源，Stream 流会对这些批量数据中的每一个数据 进行流水线式的
 * 操作   比如  过滤 筛选 切片 等操作   这些操作是不会改变原数据源  取而代之 返回的是一个新的Stream
 *
 *
 * 总结：
 * 1.把数据源转为 流       创建流
 * 2.得到流之后 进行一系列的中间操作  然后产生一个新的流  而数据源不会受到改变   中间操作
 * 3. 通过终止操作 得到 流处理的最终结果      终止操作
 *
 *
 * 注意
 *  Stream 不会存储数据
 *  Stream 不会改变数据源   返回一个持有新的结果的Stream
 *  Stream 的操作是延时操作  这就意味着 他们会等到需要结果的时候 才执行
 *
 *
 *  使用Stream 流的三个步骤’
 *  1.创建流
 *      将数据源转换为流  Stream
 *  2.中间操作
 *      一个中间操作链      对数据源中的数据进行流水线式的操作  中间操作可以有很多    就像工厂中的流水线 每一道流水线做的事情不一样
 *  3.终止操作
 *      一个终止操作   执行中间的操作链   得到最终的结果
 */
public class StreamDemo1 {

    // 关于 Stream 流的创建


    List<Student> list = Arrays.asList(
            new Student(1,"zs",18,88.0),
            new Student(2,"ls",19,88.5),
            new Student(3,"ww",21,98.0),
            new Student(4,"zl",19,86.0),
            new Student(5,"tq",17,92.0)
    );


    //集合转Stream 流
    @Test
    public void test1(){
        //通过Collection 接口 提供的方法 得到流
        Stream<Student> stream = list.stream();
        // 注意  流的泛型
        Stream<String> stream1 = Arrays.asList("a", "b", "c").stream();


    }
    // 数组转Stream 流
    @Test
    public void test2()  {
        Student[] students = new Student[10];

        //借助 Arrays 工具类 转换为 流
        Stream<Student> stream = Arrays.stream(students);

    }

    // 借助Stream 的静态方法得到流
    @Test
    public void test3(){
        Stream<String> stream = Stream.of("a", "b", "c");
    }


    //由函数 创建无限流
    @Test
    public void test4(){
        // iterate 迭代 对 种子 seed 进行 迭代
        Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);

        iterate.limit(10).forEach(System.out::println);
    }

    //由函数 创建无限流
    @Test
    public void test5(){
       Stream.generate(Student::new);
        Stream<Double> generate = Stream.generate(Math::random);

        generate.limit(10).forEach(System.out::println);
    }

}
